// 本驱动目前只支持iic驱动jy61p
//
// 使用方法：
//     1. 使用CubeMX初始化一个串口出来
//     2. 调用jy61p_init进行初始化设备
//     3. 调用jy61p_xxx读取数据

// 配置串口3
// 填写9600波特率、8位帧长、无校验位、1位停止位
// 高级设置里面的通行方向选择RX only
// PinMux选择UART3外设，RX引脚选择PA13

// 使用方法
#if 0

    jy61p_get_acc(&g_acc_x, &g_acc_y, &g_acc_z);
    jy61p_get_gyro(&g_gyro_x, &g_gyro_y, &g_gyro_z);
    jy61p_get_angle(&g_angle_x, &g_angle_y, &g_angle_z);
    
    DEBUG_INFO("g_acc_x=%.3f, g_acc_y=%.3f, g_acc_z=%.3f", g_acc_x, g_acc_y, g_acc_z);
    DEBUG_INFO("g_gyro_x=%.3f, g_gyro_y=%.3f, g_gyro_z=%.3f", g_gyro_x, g_gyro_y, g_gyro_z);
    DEBUG_INFO("g_angle_x=%.3f, g_angle_y=%.3f, g_angle_z=%.3f", g_angle_x, g_angle_y, g_angle_z);

#endif

#ifndef MYLIB_DEVICE_JY61P_H
#    define MYLIB_DEVICE_JY61P_H

#    include <mylib/mylib_config.h>

#    include <stdint.h>

// 如果没有修改，那么默认就是0x50
#    define JY61P_DEFAULT_ADDRESS 0x50

typedef void (*serial_send_byte_func)(uint8_t);
typedef void (*delay_ms_func)(int32_t);
typedef uint8_t data_frame_t[11];

typedef struct {
	// 缓冲区
	uint8_t buffer[256]; // 保证一定有可以存一帧数据的空间

	data_frame_t acc_frame; // 加速度数据
	data_frame_t gyro_frame; // 角速度数据
	data_frame_t angle_frame; // 角度数据

	bool is_parsing; // 是否正在解析数据

    uint32_t uart;
	serial_send_byte_func send_byte;
	delay_ms_func delay_ms;
}jy61p_t;

// 中断处理函数
void jy61p_irq_handler(jy61p_t* jy61p);

// 初始化
void jy61p_init(jy61p_t* jy61p, uint32_t uart);

// 打印缓冲区，调试用
void jy61p_print_buffer(jy61p_t* jy61p);

// 解析数据
void jy61p_data_parse(jy61p_t* jy61p);

// 获取加速度
void jy61p_get_acc(jy61p_t* jy61p, float* acc_x, float* acc_y, float* acc_z);

// 获取角速度
void jy61p_get_gyro(jy61p_t* jy61p, float* gyro_x, float* gyro_y, float* gyro_z);

// 获取角度
void jy61p_get_angle(jy61p_t* jy61p, float* roll, float* pitch, float* yaw);

// 校准加速度器
void jy61p_acc_calibration(jy61p_t* jy61p);

// xy轴置零
void jy61p_zero_xy(jy61p_t* jy61p);

// z轴置零
void jy61p_zero_yaw(jy61p_t* jy61p);

#endif   // !MYLIB_DEVICE_JY61P_H
